์ด๋๋ฆฌ์ ๋ธ๋ก์ฒด์ธ์์ ์ค๋งํธ ๊ณ์ฝ์ ๊ฐ๋ฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ฃผ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ธ Solidity๋ฅผ ์์๋ณด์ธ์. ์ด ์ข ํฉ ๊ฐ์ด๋๋ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ๊ณ ๊ธ ๊ธฐ์ ๊น์ง ๋ชจ๋ ๊ฒ์ ๋ค๋ฃน๋๋ค.
Solidity: ์ค๋งํธ ๊ณ์ฝ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ์ข ํฉ ๊ฐ์ด๋
Solidity๋ ์ด๋๋ฆฌ์๊ณผ ๊ฐ์ ๋ค์ํ ๋ธ๋ก์ฒด์ธ ํ๋ซํผ์์ ์ค๋งํธ ๊ณ์ฝ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ณ ๊ธ ๊ณ์ฝ ์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค. C++, Python, JavaScript์ ์ํฅ์ ํฌ๊ฒ ๋ฐ์์ผ๋ฉฐ, ์ด๋๋ฆฌ์ ๊ฐ์ ๋จธ์ (EVM)์ ๋ชฉํ๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด ๊ฐ์ด๋๋ ๋ธ๋ก์ฒด์ธ ๊ฐ๋ฐ ์ธ๊ณ์ ๋ฐ์ด๋ค๊ณ ์ ํ๋ ์ด๋ณด์์ ์๋ จ๋ ํ๋ก๊ทธ๋๋จธ ๋ชจ๋์๊ฒ ์ ํฉํ Solidity์ ๋ํ ์์ธํ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ค๋งํธ ๊ณ์ฝ์ด๋ ๋ฌด์์ธ๊ฐ์?
Solidity์ ๋ฐ์ด๋ค๊ธฐ ์ ์ ์ค๋งํธ ๊ณ์ฝ์ด ๋ฌด์์ธ์ง ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ค๋งํธ ๊ณ์ฝ์ ํฉ์ ์กฐ๊ฑด์ด ์ฝ๋์ ์ง์ ์์ฑ๋ ์์ฒด ์คํ ๊ณ์ฝ์ ๋๋ค. ์ด๋ ๋ธ๋ก์ฒด์ธ์ ์ ์ฅ๋๋ฉฐ ๋ฏธ๋ฆฌ ์ ํด์ง ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด ์๋์ผ๋ก ์คํ๋ฉ๋๋ค. ์ค๋งํธ ๊ณ์ฝ์ ๋ค์์ ํฌํจํ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋ํ, ํฌ๋ช ์ฑ ๋ฐ ๋ณด์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ํ์ค์ํ ๊ธ์ต(DeFi): ๋์ถ, ์ฐจ์ ๋ฐ ๊ฑฐ๋ ํ๋ซํผ.
- ๊ณต๊ธ๋ง ๊ด๋ฆฌ: ๋ฌผํ ์ถ์ ๋ฐ ํฌ๋ช ์ฑ ๋ณด์ฅ.
- ํฌํ ์์คํ : ์์ ํ๊ณ ๊ฒ์ฆ ๊ฐ๋ฅํ ์ ์ ํฌํ.
- ๋ถ๋์ฐ: ๋ถ๋์ฐ ๊ฑฐ๋ ์๋ํ.
- ์๋ฃ: ํ์ ๋ฐ์ดํฐ ๋ณด์ ๊ด๋ฆฌ.
Solidity๋ฅผ ์ ํํ๋ ์ด์ ?
Solidity๋ ์ฌ๋ฌ ์์ธ์ผ๋ก ์ธํด ์ด๋๋ฆฌ์ ๋ฐ ๊ธฐํ EVM ํธํ ๋ธ๋ก์ฒด์ธ์์ ์ค๋งํธ ๊ณ์ฝ์ ์์ฑํ๋ ๋ฐ ์ง๋ฐฐ์ ์ธ ์ธ์ด์ ๋๋ค.
- EVM ํธํ์ฑ: Solidity๋ ์ด๋๋ฆฌ์ ๊ฐ์ ๋จธ์ ์์ ์คํ๋ ์ ์๋ ๋ฐ์ดํธ์ฝ๋๋ก ์ปดํ์ผ๋๋๋ก ํน๋ณํ ์ค๊ณ๋์์ต๋๋ค.
- ์ปค๋ฎค๋ํฐ ์ง์: ํฌ๊ณ ํ๋ฐํ ์ปค๋ฎค๋ํฐ๊ฐ ๊ด๋ฒ์ํ ๋ฌธ์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ๋ณด์ ๊ธฐ๋ฅ: Solidity์๋ ์ผ๋ฐ์ ์ธ ์ค๋งํธ ๊ณ์ฝ ์ทจ์ฝ์ ์ ์ํํ๋ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค.
- ๊ณ ์์ค ์ถ์ํ: ๊ณ์ฝ ๊ฐ๋ฐ์ ๋ ํจ์จ์ ์ด๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๊ณ ์์ค ๊ตฌ์ฑ์ ์ ๊ณตํฉ๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ ์ค์
Solidity ๊ฐ๋ฐ์ ์์ํ๋ ค๋ฉด ์ ํฉํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ค์ ํด์ผ ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ธ๊ธฐ ์๋ ์ต์ ์ ๋๋ค.
Remix IDE
Remix๋ Solidity ํ์ต ๋ฐ ์คํ์ ์๋ฒฝํ ์จ๋ผ์ธ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ IDE์ ๋๋ค. ๋ก์ปฌ ์ค์น๊ฐ ํ์ ์์ผ๋ฉฐ ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๊ตฌ๋ฌธ ๊ฐ์กฐ ๋ฐ ์๋ ์์ฑ ๊ธฐ๋ฅ์ด ์๋ ์ฝ๋ ํธ์ง๊ธฐ.
- Solidity ์ฝ๋๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๋ ์ปดํ์ผ๋ฌ.
- ํ ์คํธ ๋คํธ์ํฌ ๋๋ ๋ฉ์ธ๋ท์ ๊ณ์ฝ์ ๋ฐฐํฌํ๋ ๋ฐฐํฌ ๋๊ตฌ.
- ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํ๊ณ ์ค๋ฅ๋ฅผ ์๋ณํ๋ ๋๋ฒ๊ฑฐ.
Remix IDE๋ https://remix.ethereum.org/์์ ์ ์ํ ์ ์์ต๋๋ค.
Truffle Suite
Truffle์ ์ค๋งํธ ๊ณ์ฝ์ ๋น๋, ํ ์คํธ ๋ฐ ๋ฐฐํฌํ๋ ํ๋ก์ธ์ค๋ฅผ ๋จ์ํํ๋ ํฌ๊ด์ ์ธ ๊ฐ๋ฐ ํ๋ ์์ํฌ์ ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- Truffle: ํ๋ก์ ํธ ์ค์บํด๋ฉ, ์ปดํ์ผ, ๋ฐฐํฌ ๋ฐ ํ ์คํธ๋ฅผ ์ํ ๋ช ๋ น์ค ๋๊ตฌ.
- Ganache: ๋ก์ปฌ ๊ฐ๋ฐ์ ์ํ ๊ฐ์ธ ๋ธ๋ก์ฒด์ธ.
- Drizzle: ์ค๋งํธ ๊ณ์ฝ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ ์ฝ๊ฒ ํตํฉํ ์ ์๋๋ก ํ๋ ํ๋ฐํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ชจ์.
Truffle์ ์ค์นํ๋ ค๋ฉด:
npm install -g truffle
Hardhat
Hardhat์ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ผ๋ก ์ ๋ช ํ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ ์ด๋๋ฆฌ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋๋ค. Solidity ์ฝ๋๋ฅผ ์ปดํ์ผ, ๋ฐฐํฌ, ํ ์คํธ ๋ฐ ๋๋ฒ๊ทธํ ์ ์์ต๋๋ค. ์ฃผ์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํ ์คํธ๋ฅผ ์ํ ๋ด์ฅ ๋ก์ปฌ ์ด๋๋ฆฌ์ ๋คํธ์ํฌ.
- ๊ธฐ๋ฅ ํ์ฅ์ ์ํ ํ๋ฌ๊ทธ์ธ ์ํ๊ณ.
- Console.log ๋๋ฒ๊น .
Hardhat์ ์ค์นํ๋ ค๋ฉด:
npm install --save-dev hardhat
Solidity ๊ธฐ๋ณธ: ๊ตฌ๋ฌธ ๋ฐ ๋ฐ์ดํฐ ์ ํ
Solidity์ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ๊ณผ ๋ฐ์ดํฐ ์ ํ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Solidity ๊ณ์ฝ์ ๊ตฌ์กฐ
Solidity ๊ณ์ฝ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํด๋์ค์ ์ ์ฌํฉ๋๋ค. ์ํ ๋ณ์, ํจ์ ๋ฐ ์ด๋ฒคํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ค์์ ๊ฐ๋จํ ์์์ ๋๋ค.
pragma solidity ^0.8.0;
contract SimpleStorage {
uint256 storedData;
function set(uint256 x) public {
storedData = x;
}
function get() public view returns (uint256) {
return storedData;
}
}
์ค๋ช :
pragma solidity ^0.8.0;: Solidity ์ปดํ์ผ๋ฌ ๋ฒ์ ์ ์ง์ ํฉ๋๋ค. ์๊ธฐ์น ์์ ๋์์ ํผํ๊ธฐ ์ํด ํธํ๋๋ ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.contract SimpleStorage { ... }:SimpleStorage๋ผ๋ ์ด๋ฆ์ ๊ณ์ฝ์ ์ ์ํฉ๋๋ค.uint256 storedData;:uint256ํ์ (256๋นํธ ๋ถํธ ์๋ ์ ์)์storedData๋ผ๋ ์ด๋ฆ์ ์ํ ๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.function set(uint256 x) public { ... }: ๋ถํธ ์๋ ์ ์๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์storedData๋ณ์๋ฅผ ์ ๋ฐ์ดํธํ๋set์ด๋ผ๋ ์ด๋ฆ์ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.publicํค์๋๋ ์ด ํจ์๊ฐ ๋๊ตฌ๋ ํธ์ถํ ์ ์์์ ์๋ฏธํฉ๋๋ค.function get() public view returns (uint256) { ... }:storedData์ ๊ฐ์ ๋ฐํํ๋get์ด๋ผ๋ ์ด๋ฆ์ ํจ์๋ฅผ ์ ์ํฉ๋๋ค.viewํค์๋๋ ํจ์๊ฐ ๊ณ์ฝ์ ์ํ๋ฅผ ์์ ํ์ง ์์์ ๋ํ๋ ๋๋ค.
๋ฐ์ดํฐ ์ ํ
Solidity๋ ๋ค์ํ ๋ฐ์ดํฐ ์ ํ์ ์ง์ํฉ๋๋ค.
- ์ ์:
uint(๋ถํธ ์๋ ์ ์) ๋ฐint(๋ถํธ ์๋ ์ ์)์ ๋ค์ํ ํฌ๊ธฐ(์:uint8,uint256). - ๋ถ๋ฆฌ์ธ:
bool(true๋๋false). - ์ฃผ์:
address(์ด๋๋ฆฌ์ ์ฃผ์๋ฅผ ๋ํ๋). - ๋ฐ์ดํธ:
bytes(๊ณ ์ ํฌ๊ธฐ ๋ฐ์ดํธ ๋ฐฐ์ด) ๋ฐstring(๋์ ํฌ๊ธฐ ๋ฌธ์์ด). - ๋ฐฐ์ด: ๊ณ ์ ํฌ๊ธฐ(์:
uint[5]) ๋ฐ ๋์ ํฌ๊ธฐ(์:uint[]). - ๋งคํ: ํค-๊ฐ ์(์:
mapping(address => uint)).
์์:
pragma solidity ^0.8.0;
contract DataTypes {
uint256 public age = 30;
bool public isAdult = true;
address public owner = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
bytes32 public name = "JohnDoe";
uint[] public numbers = [1, 2, 3, 4, 5];
mapping(address => uint) public balances;
constructor() {
balances[msg.sender] = 100;
}
}
์ํ ๋ณ์ vs. ์ง์ญ ๋ณ์
์ํ ๋ณ์๋ ํจ์ ์ธ๋ถ์ ์ ์ธ๋๋ฉฐ ๋ธ๋ก์ฒด์ธ์ ์ ์ฅ๋ฉ๋๋ค. ์ด๋ค์ ํจ์ ํธ์ถ ๋ฐ ๊ณ์ฝ ์คํ ์ ๋ฐ์ ๊ฑธ์ณ ์ง์๋ฉ๋๋ค. ์ ์์์์ storedData๋ ์ํ ๋ณ์์
๋๋ค.
์ง์ญ ๋ณ์๋ ํจ์ ๋ด๋ถ์ ์ ์ธ๋๋ฉฐ ํด๋น ํจ์์ ๋ฒ์ ๋ด์์๋ง ์กด์ฌํฉ๋๋ค. ์ด๋ค์ ๋ธ๋ก์ฒด์ธ์ ์ ์ฅ๋์ง ์์ผ๋ฉฐ ํจ์๊ฐ ์๋ฃ๋๋ฉด ํ๊ธฐ๋ฉ๋๋ค.
Solidity์ ํจ์
ํจ์๋ ์ค๋งํธ ๊ณ์ฝ์ ๊ตฌ์ฑ ์์์ ๋๋ค. ์ด๋ค์ ๊ณ์ฝ์ด ์ํํ ์ ์๋ ๋ ผ๋ฆฌ์ ์์ ์ ์ ์ํฉ๋๋ค. ํจ์๋ ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
- ๊ณ์ฝ์ ์ํ๋ฅผ ์์ ํฉ๋๋ค.
- ๊ณ์ฝ์ ์ํ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค.
- ๋ค๋ฅธ ๊ณ์ฝ๊ณผ ์ํธ ์์ฉํฉ๋๋ค.
- ์ด๋๋ฅผ ๋ณด๋ด๊ฑฐ๋ ๋ฐ์ต๋๋ค.
ํจ์ ๊ฐ์์ฑ
Solidity ํจ์์๋ ๋ค ๊ฐ์ง ๊ฐ์์ฑ ํ์ ์๊ฐ ์์ต๋๋ค.
- public: ๋ด๋ถ ๋ฐ ์ธ๋ถ์์ ํธ์ถํ ์ ์์ต๋๋ค.
- private: ๊ณ์ฝ ๋ด์์๋ง ๋ด๋ถ์ ์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค.
- internal: ๊ณ์ฝ ๋ด์์์ ํ์๋ ๊ณ์ฝ์์ ๋ด๋ถ์ ์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค.
- external: ์ธ๋ถ์์๋ง ํธ์ถํ ์ ์์ต๋๋ค.
ํจ์ ํ์ ์
ํจ์ ํ์ ์๋ ํจ์์ ๋์์ ์์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ค์ ์ข ์ข ๋ณด์ ์ ์ฝ์ ์ ์ฉํ๊ฑฐ๋ ํจ์ ๋ ผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ ์ ๊ฒ์ฌ๋ฅผ ์ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์์:
pragma solidity ^0.8.0;
contract Ownership {
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "Only owner can call this function");
_;
}
function transferOwnership(address newOwner) public onlyOwner {
owner = newOwner;
}
}
์ด ์์์์ onlyOwner ํ์ ์๋ ํธ์ถ์๊ฐ ๊ณ์ฝ์ ์์ ์์ธ์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ํธ๋์ญ์
์ ๋๋๋ฆฝ๋๋ค. _ ํ๋ ์ด์คํ๋๋ ํจ์ ์ฝ๋์ ๋๋จธ์ง ๋ถ๋ถ์ ๋ํ๋
๋๋ค.
ํจ์ ์ํ ๊ฐ๋ณ์ฑ
Solidity ํจ์๋ ์ํ ๊ฐ๋ณ์ฑ ํ์ ์๋ฅผ ๊ฐ์ง ์๋ ์์ต๋๋ค.
- view: ํจ์๊ฐ ๊ณ์ฝ์ ์ํ๋ฅผ ์์ ํ์ง ์์์ ๋ํ๋ ๋๋ค. ์ํ ๋ณ์๋ฅผ ์ฝ์ ์ ์์ง๋ง ์ธ ์๋ ์์ต๋๋ค.
- pure: ํจ์๊ฐ ๊ณ์ฝ์ ์ํ๋ฅผ ์ฝ๊ฑฐ๋ ์์ ํ์ง ์์์ ๋ํ๋ ๋๋ค. ์์ ํ ์์ฒด ํฌํจ๋๊ณ ๊ฒฐ์ ์ ์ ๋๋ค.
- payable: ํจ์๊ฐ ์ด๋๋ฅผ ๋ฐ์ ์ ์์์ ๋ํ๋ ๋๋ค.
์์:
pragma solidity ^0.8.0;
contract Example {
uint256 public value;
function getValue() public view returns (uint256) {
return value;
}
function add(uint256 x) public pure returns (uint256) {
return x + 5;
}
function deposit() public payable {
value += msg.value;
}
}
์ ์ด ๊ตฌ์กฐ
Solidity๋ if, else, for, while, do-while ๋ฃจํ์ ๊ฐ์ ํ์ค ์ ์ด ๊ตฌ์กฐ๋ฅผ ์ง์ํฉ๋๋ค.
์์:
pragma solidity ^0.8.0;
contract ControlStructures {
function checkValue(uint256 x) public pure returns (string memory) {
if (x > 10) {
return "Value is greater than 10";
} else if (x < 10) {
return "Value is less than 10";
} else {
return "Value is equal to 10";
}
}
function sumArray(uint[] memory arr) public pure returns (uint256) {
uint256 sum = 0;
for (uint256 i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
}
์ด๋ฒคํธ ๋ฐ ๋ก๊น
์ด๋ฒคํธ๋ฅผ ํตํด ์ค๋งํธ ๊ณ์ฝ์ ์ธ๋ถ ์ธ๊ณ์ ํต์ ํ ์ ์์ต๋๋ค. ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ธ๋ก์ฒด์ธ์ ํธ๋์ญ์ ๋ก๊ทธ์ ์ ์ฅ๋ฉ๋๋ค. ์ด๋ฌํ ๋ก๊ทธ๋ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ณ์ฝ์ ํ๋์ ์ถ์ ํ๋ ๋ฐ ๋ชจ๋ํฐ๋ง๋ ์ ์์ต๋๋ค.
์์:
pragma solidity ^0.8.0;
contract EventExample {
event ValueChanged(address indexed caller, uint256 newValue);
uint256 public value;
function setValue(uint256 newValue) public {
value = newValue;
emit ValueChanged(msg.sender, newValue);
}
}
์ด ์์์์ setValue ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ValueChanged ์ด๋ฒคํธ๊ฐ ๋ฐ์ํฉ๋๋ค. caller ๋งค๊ฐ๋ณ์์ indexed ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์
์ด ํธ์ถ์์ ์ฃผ์์ ๋ฐ๋ผ ์ด๋ฒคํธ๋ฅผ ํํฐ๋งํ ์ ์์ต๋๋ค.
์์
Solidity๋ ์์์ ์ง์ํ์ฌ ๊ธฐ์กด ๊ณ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ๊ณ์ฝ์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ์ฝ๋ ์ฌ์ฌ์ฉ ๋ฐ ๋ชจ๋์ฑ์ ์ด์งํฉ๋๋ค.
์์:
pragma solidity ^0.8.0;
contract BaseContract {
uint256 public value;
function setValue(uint256 newValue) public {
value = newValue;
}
}
contract DerivedContract is BaseContract {
function incrementValue() public {
value++;
}
}
์ด ์์์์ DerivedContract๋ BaseContract๋ฅผ ์์ํฉ๋๋ค. value ์ํ ๋ณ์์ setValue ํจ์๋ฅผ ์์ํ๋ฉฐ, ์์ฒด ํจ์์ธ incrementValue๋ ์ ์ํฉ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ณ์ฝ๊ณผ ์ ์ฌํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ์ด๋ค์ ์ฌ๋ฌ ๊ณ์ฝ์์ ํธ์ถํ ์ ์๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ๋ฐฐํฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ ๋ฒ๋ง ๋ฐฐํฌ๋๋ฏ๋ก ๊ฐ์ค ๋น์ฉ์ ์ค์ผ ์ ์์ต๋๋ค.
์์:
pragma solidity ^0.8.0;
library Math {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
}
contract Example {
using Math for uint256;
uint256 public result;
function calculateSum(uint256 x, uint256 y) public {
result = x.add(y);
}
}
์ด ์์์์ Math ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ add ํจ์๋ฅผ ์ ์ํฉ๋๋ค. using Math for uint256; ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ uint256 ๋ณ์์์ add ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ค๋งํธ ๊ณ์ฝ ์ทจ์ฝ์
์ค๋งํธ ๊ณ์ฝ์ ์๊ธ ์์ค ๋๋ ์๊ธฐ์น ์์ ๋์์ ์ด๋ํ ์ ์๋ ๋ค์ํ ์ทจ์ฝ์ ์ ์ทจ์ฝํฉ๋๋ค. ์ด๋ฌํ ์ทจ์ฝ์ ์ ์ธ์ํ๊ณ ์ํ ์กฐ์น๋ฅผ ์ทจํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ฌ์ง์ ๊ณต๊ฒฉ (Reentrancy)
์ฌ์ง์ ์ ๊ณ์ฝ์ด ์ธ๋ถ ๊ณ์ฝ์ ํธ์ถํ๊ณ , ์ธ๋ถ ๊ณ์ฝ์ด ์๋ ๊ณ์ฝ์ ์คํ์ด ์๋ฃ๋๊ธฐ ์ ์ ์๋ ๊ณ์ฝ์ ๋ค์ ํธ์ถํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์๊ธฐ์น ์์ ์ํ ๋ณ๊ฒฝ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ํ: Checks-Effects-Interactions ํจํด์ ์ฌ์ฉํ๊ณ , ์ธ๋ถ ํธ์ถ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ค๋ฅผ ์ ํํ๊ธฐ ์ํด transfer ๋๋ send ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
์ค๋ฒํ๋ก์ฐ ๋ฐ ์ธ๋ํ๋ก์ฐ
์ค๋ฒํ๋ก์ฐ๋ ์ฐ์ ์ฐ์ฐ์ด ๋ฐ์ดํฐ ์ ํ์ ์ต๋๊ฐ์ ์ด๊ณผํ ๋ ๋ฐ์ํฉ๋๋ค. ์ธ๋ํ๋ก์ฐ๋ ์ฐ์ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ดํฐ ์ ํ์ ์ต์๊ฐ๋ณด๋ค ์์ ๋ ๋ฐ์ํฉ๋๋ค.
์ํ: SafeMath ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ์ญ์์ค (Solidity 0.8.0 ์ด์ ๋ฒ์ ์์๋ ์ค๋ฒํ๋ก์ฐ ๋ฐ ์ธ๋ํ๋ก์ฐ ๊ฒ์ฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ด์ฅ๋์ด ์์ต๋๋ค).
ํ์์คํฌํ ์์กด์ฑ
๋ธ๋ก ํ์์คํฌํ(block.timestamp)์ ์์กดํ๋ฉด ์ฑ๊ตด์๊ฐ ํ์์คํฌํ๋ฅผ ์ด๋ ์ ๋ ์ ์ดํ ์ ์์ผ๋ฏ๋ก ๊ณ์ฝ์ด ์กฐ์์ ์ทจ์ฝํด์ง ์ ์์ต๋๋ค.
์ํ: ์ค์ํ ๋ก์ง์ block.timestamp ์ฌ์ฉ์ ํผํ์ญ์์ค. ์ค๋ผํด ๋๋ ๊ธฐํ ๋ ์ ๋ขฐํ ์ ์๋ ์๊ฐ ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
์๋น์ค ๊ฑฐ๋ถ (DoS)
DoS ๊ณต๊ฒฉ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ค๋ฅผ ์๋นํ๊ฑฐ๋ ๊ณ์ฝ์ด ๋๋์๊ฐ๊ฒ ํ๋ ์ทจ์ฝ์ ์ ์ ์ฉํ์ฌ ๊ณ์ฝ์ ํฉ๋ฒ์ ์ธ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์ํ: ๊ฐ์ค ์ ํ์ ๊ตฌํํ๊ณ , ๋ฌดํ ๋ฐ๋ณต ๋ฃจํ๋ฅผ ํผํ๊ณ , ์ฌ์ฉ์ ์ ๋ ฅ์ ์ ์คํ๊ฒ ๊ฒ์ฆํ์ญ์์ค.
ํ๋ก ํธ ๋ฌ๋
ํ๋ก ํธ ๋ฌ๋์ ๋๊ตฐ๊ฐ ๋ณด๋ฅ ์ค์ธ ํธ๋์ญ์ ์ ๊ด์ฐฐํ๊ณ ์๋ ํธ๋์ญ์ ๋ณด๋ค ๋จผ์ ์คํ๋๋๋ก ๋ ๋์ ๊ฐ์ค ๊ฐ๊ฒฉ์ผ๋ก ์์ ์ ํธ๋์ญ์ ์ ์ ์ถํ ๋ ๋ฐ์ํฉ๋๋ค.
์ํ: ํธ๋์ญ์ ์คํ ํ๊น์ง ์ธ๋ถ ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ธฐ ์ํด ์ปค๋ฐ-๊ณต๊ฐ ๋ฐฉ์์ ์ฌ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ๊ธฐ์ ์ ์ฌ์ฉํ์ญ์์ค.
์์ ํ ์ค๋งํธ ๊ณ์ฝ ์์ฑ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๊ฐ๋จํ๊ฒ ์ ์ง: ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ์ญ์์ค.
- Checks-Effects-Interactions ํจํด ๋ฐ๋ฅด๊ธฐ: ์ํ ๋ณ๊ฒฝ์ด ์ด๋ฃจ์ด์ง๊ธฐ ์ ์ ๊ฒ์ฌ๊ฐ ์ํ๋๊ณ , ๋ค๋ฅธ ๊ณ์ฝ๊ณผ์ ์ํธ ์์ฉ์ด ๋ง์ง๋ง์ ์ด๋ฃจ์ด์ง๋๋ก ํ์ญ์์ค.
- ๋ณด์ ๋๊ตฌ ์ฌ์ฉ: Slither ๋ฐ Mythril๊ณผ ๊ฐ์ ์ ์ ๋ถ์ ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ์ ์ฌ์ ์ธ ์ทจ์ฝ์ ์ ์๋ณํ์ญ์์ค.
- ๋จ์ ํ ์คํธ ์์ฑ: ์ค๋งํธ ๊ณ์ฝ์ด ์์๋๋ก ์๋ํ๋์ง ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค.
- ๊ฐ์ฌ ๋ฐ๊ธฐ: ๋ฉ์ธ๋ท์ ๋ฐฐํฌํ๊ธฐ ์ ์ ํํ ์ข์ ๋ณด์ ํ์ฌ์ ์ค๋งํธ ๊ณ์ฝ ๊ฐ์ฌ๋ฅผ ๋ฐ์ผ์ญ์์ค.
- ์ต์ ์ ๋ณด ์ ์ง: Solidity ์ปค๋ฎค๋ํฐ์ ์ต์ ๋ณด์ ์ทจ์ฝ์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์์งํ์ญ์์ค.
๊ณ ๊ธ Solidity ๊ฐ๋
๊ธฐ๋ณธ ์ฌํญ์ ํ์คํ ์ดํดํ๋ค๋ฉด ๋ ๊ณ ๊ธ ๊ฐ๋ ์ ํ์ํ ์ ์์ต๋๋ค.
์ด์ ๋ธ๋ฆฌ
Solidity๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ผ์ธ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด EVM์ ๋ ์ ์ ์ดํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ค๋ฅ ๋ฐ ์ทจ์ฝ์ ๋์ ์ํ๋ ์ฆ๊ฐ์ํต๋๋ค.
ํ๋ก์
ํ๋ก์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ์ง ์๊ณ ๋ ์ค๋งํธ ๊ณ์ฝ์ ์ ๊ทธ๋ ์ด๋ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๊ตฌํ ๊ณ์ฝ์ผ๋ก ํธ์ถ์ ์ ๋ฌํ๋ ํ๋ก์ ๊ณ์ฝ์ ๋ฐฐํฌํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๊ณ์ฝ์ ์ ๊ทธ๋ ์ด๋ํ๋ ค๋ฉด ์ ๊ตฌํ ๊ณ์ฝ์ ๋ฐฐํฌํ๊ณ ํ๋ก์๊ฐ ์ ๊ตฌํ์ ๊ฐ๋ฆฌํค๋๋ก ์ ๋ฐ์ดํธํ๋ฉด ๋ฉ๋๋ค.
๋ฉํ ํธ๋์ญ์
๋ฉํ ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ๊ฐ์ค ๋น์ฉ์ ์ง์ ์ง๋ถํ์ง ์๊ณ ๋ ์ค๋งํธ ๊ณ์ฝ๊ณผ ์ํธ ์์ฉํ ์ ์์ต๋๋ค. ๋์ ๋ฆด๋ ์ด์ด๊ฐ ์ฌ์ฉ์๋ฅผ ๋์ ํ์ฌ ๊ฐ์ค ๋น์ฉ์ ์ง๋ถํฉ๋๋ค. ์ด๋ ํนํ ๋ธ๋ก์ฒด์ธ์ ์ต์ํ์ง ์์ ์ฌ์ฉ์์๊ฒ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
EIP-721 ๋ฐ EIP-1155 (NFT)
Solidity๋ EIP-721 ๋ฐ EIP-1155์ ๊ฐ์ ํ์ค์ ์ฌ์ฉํ์ฌ ๋์ฒด ๋ถ๊ฐ๋ฅ ํ ํฐ(NFT)์ ์์ฑํ๋ ๋ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ํ์ค์ ์ดํดํ๋ ๊ฒ์ NFT ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
Solidity์ ๋ธ๋ก์ฒด์ธ์ ๋ฏธ๋
Solidity๋ ๋น ๋ฅด๊ฒ ์งํํ๋ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ ํ๊ฒฝ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๋ธ๋ก์ฒด์ธ ์ฑํ์ด ๊ณ์ ์ฆ๊ฐํจ์ ๋ฐ๋ผ Solidity ๊ฐ๋ฐ์๋ ํ์ ์ ์ด๊ณ ์์ ํ ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋์ ์์๋ฅผ ๋ฐ์ ๊ฒ์ ๋๋ค. ์ด ์ธ์ด๋ ๋์์์ด ์ ๋ฐ์ดํธ๋๊ณ ๊ฐ์ ๋๊ณ ์์ผ๋ฏ๋ก ์ด ๋ถ์ผ์์ ์ฑ๊ณตํ๋ ค๋ฉด ์ต์ ๊ฐ๋ฐ ๋ํฅ์ ํ์ ํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
๊ฒฐ๋ก
Solidity๋ ์ด๋๋ฆฌ์ ๋ธ๋ก์ฒด์ธ์์ ์ค๋งํธ ๊ณ์ฝ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ์ธ์ด์ ๋๋ค. ์ด ๊ฐ์ด๋๋ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ๊ณ ๊ธ ๊ธฐ์ ๊น์ง Solidity์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. Solidity๋ฅผ ๋ง์คํฐํ๊ณ ์์ ํ ๊ฐ๋ฐ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ํฅ๋ฏธ์ง์งํ ์ธ๊ณ์ ๊ธฐ์ฌํ๊ณ ๋ธ๋ก์ฒด์ธ ๊ธฐ์ ์ ๋ฏธ๋๋ฅผ ํ์ฑํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ํญ์ ๋ณด์์ ์ต์ฐ์ ์ผ๋ก ์๊ฐํ๊ณ , ์ฝ๋๋ฅผ ์ฒ ์ ํ ํ ์คํธํ๋ฉฐ, Solidity ์ํ๊ณ์ ์ต์ ๊ฐ๋ฐ ๋ํฅ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. ์ค๋งํธ ๊ณ์ฝ์ ์ ์ฌ๋ ฅ์ ์์ฒญ๋๋ฉฐ, Solidity๋ฅผ ํตํด ํ์ ์ ์ธ ์์ด๋์ด๋ฅผ ํ์ค๋ก ๋ง๋ค ์ ์์ต๋๋ค.